﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using CDSBDemandControl.Presenter;
using CDSBDemandControl.Model;

namespace CDSBDemandControl.View.Web.PaginasInternas
{
    public partial class Esteira : System.Web.UI.Page, IDiscriminatorDemand
    {
        private Presenter.DiscriminatorDemand Presenter;
        private int i = 0;

        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Cache.SetExpires(DateTime.Now.Subtract(new TimeSpan(24, 0, 0)));
            Response.Cache.SetCacheability(HttpCacheability.NoCache);

            if (!this.IsPostBack || this.Session["Presenter"] == null)
            {
                this.Presenter = new DiscriminatorDemand(this);

                this.Session["Presenter"] = this.Presenter;

                if (!this.IsPostBack) this.ListarEsteira();
            }
            else
            {
                this.Presenter = (Presenter.DiscriminatorDemand)this.Session["Presenter"];
                this.Presenter.ResetView(this);
            }
        }

        private void ListarEsteira()
        {
            this.ConfigurarFiltros(Filtros.Projetos);
            this.Presenter.ListWorkItensIndevelopment(this.RecuperarFiltroProjeto());
        }

        private void ConfigurarFiltros(Filtros filtro)
        {
            switch (filtro)
            {
                case Filtros.Fabricas:
                    this.TblFiltro.Visible = true;
                    this.spanFiltroFabrica.Visible = true;
                    this.spanFiltroProjetos.Visible = false;
                    break;
                case Filtros.Projetos:
                    this.TblFiltro.Visible = true;
                    this.spanFiltroFabrica.Visible = false;
                    this.spanFiltroProjetos.Visible = true;
                    break;
                case Filtros.Todos:
                    this.TblFiltro.Visible = true;
                    this.spanFiltroFabrica.Visible = true;
                    this.spanFiltroProjetos.Visible = true;
                    break;
                case Filtros.Nenhum:
                    this.TblFiltro.Visible = false;
                    break;
            }
        }

        private FiltroProjeto RecuperarFiltroProjeto()
        {
            switch (this.cmbFiltroProjeto.SelectedValue)
            {
                case "SiteBVMF":
                    return FiltroProjeto.SiteBVMF;
                case "Sinacor":
                    return FiltroProjeto.Sinacor;
                case "iMercado":
                    return FiltroProjeto.iMercado;
                default:
                    return FiltroProjeto.Todos;
            }
        }

        protected void CmbFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            FiltrarDados();
        }

        private void FiltrarDados()
        {
            this.ListarEsteira();
        }

        protected void Grid_DataBinding(object sender, EventArgs e)
        {
            ((GridView)sender).Visible = true;
        }

        public void ExibirEsteira(IEnumerable<DemandModel> demandModels)
        {
            // Binding
            this.GrdEsteira.DataSource = demandModels;
            this.GrdEsteira.DataBind();

            // Exibe número total de registros
            this.ExibirTotalRegistro(GrdEsteira.Rows.Count, "{0} WorkItem{1} em Desenvolvimento", GrdEsteira.Rows.Count > 1 ? "s" : string.Empty);

            string Mensagem = GrdEsteira.Rows.Count > 0 ? string.Empty : "Não há WorkItens na esteira de Desenvolvimento.";

            // Exibe Mensagem quando não houver dados na Grid
            this.ValidarGridSemResultado(Mensagem, string.Empty);

            // Exibe/Oculta legenda
            this.CriarLegenda((GrdEsteira.Rows.Count > 0) ? Visao.Esteira : Visao.Outros);

            // Insere texto explicativo de Esteira
            this.ExibirObservacao("Ordenado por Tipo do work Item e Término Estimado.");

            // Exibe a data da última atualização
            (this.Master.FindControl("LblUltimoUpdate") as Label).Text = "Última atualização em: " + this.Presenter.DemandListLastUpdate.ToShortDateString() + " as " + this.Presenter.DemandListLastUpdate.ToShortTimeString();

            (this.Master.FindControl("txtTimeToCompare") as HtmlGenericControl).InnerHtml =
                this.Presenter.DemandListLastUpdate.Year + "," +
                (this.Presenter.DemandListLastUpdate.Month - 1) + "," +
                this.Presenter.DemandListLastUpdate.Day + "," +
                this.Presenter.DemandListLastUpdate.Hour + "," +
                this.Presenter.DemandListLastUpdate.Minute + "," +
                this.Presenter.DemandListLastUpdate.Second;
        }

        private void ValidarGridSemResultado(string msgSemResultado1, string msgSemResultado2)
        {
            this.lblMsgSemResultados1.Visible = (msgSemResultado1.Length > 0);
            this.lblMsgSemResultados1.Text = msgSemResultado1;
        }

        private void ExibirTotalRegistro(int count, string texto, string plural)
        {
            this.lblTotalRegistros1.Visible = count > 0 ? true : false;
            this.lblTotalRegistros1.Text = string.Format(texto, count, plural);
        }

        private void CriarLegenda(Visao tipoLegenda)
        {
            this.DvLegenda.Visible = true;

            switch (tipoLegenda)
            {
                case Visao.Fila:
                    #region Fila
                    this.LgdFormatoAWAY.Text = "Título - Ínicio Estimado";
                    this.LgdFormatoLATE.Text = "Título - Ínicio Estimado";
                    this.LgdFormatoDEADLINE.Text = "Título - Ínicio Estimado";
                    this.LgdFormatoDEADLINECOMMING.Text = "Título - Ínicio Estimado";

                    this.LgdDescAWAY.Text = "Previsão de início está a mais de 7 dias.";
                    this.LgdDescLATE.Text = "Previsão de início não informada, deveria começar hoje ou está atrasada;";
                    this.LgdDescDEADLINE.Text = "Previsão de início está entre amanhã ou depois;";
                    this.LgdDescDEADLINECOMMING.Text = "Previsão de início está a menos de 7 dias;";
                    #endregion
                    break;
                case Visao.Esteira:
                    #region Esteira
                    this.LgdFormatoAWAY.Text = "Data - Responsável";
                    this.LgdFormatoLATE.Text = "Data - Responsável";
                    this.LgdFormatoDEADLINE.Text = "Data - Responsável";
                    this.LgdFormatoDEADLINECOMMING.Text = "Data - Responsável";

                    this.LgdDescAWAY.Text = "Tarefa em andamento, esse é o ponto máximo onde problemas de artefatos devem ser identificados, pois não geram grande impacto.";
                    this.LgdDescLATE.Text = "Problema, tarefa Atrasada;";
                    this.LgdDescDEADLINE.Text = "Alerta, riscos e impactos no check-in devem ser avaliados e mitigados;";
                    this.LgdDescDEADLINECOMMING.Text = "Atenção, a partir desse ponto, qualquer incidente pode gerar atraso, o acompanhamento do líder deve ser itensificado;";
                    #endregion
                    break;
                case Visao.Disponibilidade:
                    #region Disponibilidade
                    this.LgdFormatoAWAY.Text = " Data ";
                    this.LgdFormatoLATE.Text = " Data ";
                    this.LgdFormatoDEADLINE.Text = " Data ";
                    this.LgdFormatoDEADLINECOMMING.Text = " Data ";
                    this.LgdDescAWAY.Text = "Desenvolvedor com atividades programadas para os próximos 7 dias ou mais.";
                    this.LgdDescLATE.Text = "Desenvolvedor livre, com atividades programadas apenas para hoje ou amanhã;";
                    this.LgdDescDEADLINE.Text = "Desenvolvedor com atividades programadas para os próximos 3 dias;";
                    this.LgdDescDEADLINECOMMING.Text = "Desenvolvedor com atividades programadas para os próximos 6 dias;";
                    #endregion
                    break;
                default:
                    this.DvLegenda.Visible = false;
                    break;
            }
        }

        private void ExibirObservacao(string obs)
        {
            this.LblObsOrdenacao.Text = obs;
            this.LblObsOrdenacao.Visible = this.LblObsOrdenacao.Text.Length > 0 ? true : false;
        }

        public string formatTitle(object title, object description)
        {
            i++;
            string id = i + title.ToString().ToLower().Trim().Replace(" ", "").Replace("-", "").Replace("á", "").Replace("ç", "").Replace("(", "").Replace(")", "").Replace("ã", "").Replace("õ", "");
            string content = description == null ? null : description.ToString();

            string link = "<span onclick=\"javascript:{ var aux =  document.getElementById('" + id + "'); var auxLink =  document.getElementById('span" + id + "'); if(aux.style.display == 'none') {aux.style.display = 'block'; auxLink.innerHTML = '<b>&nbsp;(-)</b>';} else {aux.style.display = 'none'; auxLink.innerHTML = '<b>&nbsp;(+)</b>';}}\"><span id='" + "span" + id + "' style='cursor:hand; color:red;'><b> (+)</b></span><b>" + title + "</b></span>";

            string div = link + @"<div id='" + id + "' style='visibility:collapse;display:none; position:relative;'><i>" + content + "</i></div>";

            if (string.IsNullOrEmpty(content))
                return "<b>" + title + "</b>";
            else
                return div;
        }

        #region IDiscriminatorDemand Members

        void IDiscriminatorDemand.ExibirFila(IEnumerable<DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirRanking(IEnumerable<DeveloperModel> developers, IEnumerable<DeveloperModel> leaders, IEnumerable<DeveloperModel> focalpoints)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirAtrasos(IEnumerable<DemandModel> PendingDemands, IEnumerable<DemandModel> Concludeddemands)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirFaturamento(List<BillingModel> billing, bool canSeeBilling)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirCodeReview(IEnumerable<DemandModel> WorkItemsWithCodeReview, IEnumerable<DemandModel> WorkItemsWithoutCodeReview)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirBugsdeProducao(IEnumerable<DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirScenariosAndTasks(List<CDSBDemandControl.Model.ScenarioModel> scenarios)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirListaDisp(IEnumerable<DemandModel> list, IEnumerable<DeveloperModel> modelAusencias, List<DateTime> fer)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirBugsdeProducaoUltimoMes(List<DemandModel> BugList)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirFactoryWaitingList(List<BillingModel> Billing, bool AllowsShow)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirAlocacao(IEnumerable<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirFactoryProductionList(List<BillingModel> billing, bool canSeeBilling)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirSolicitacoesSites(List<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirManagementTeamTasks(List<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
